package ScalaStudy.chapter07

object Test15_HighLevelFunction_Reduce_Fold {

  def main(args: Array[String]): Unit = {


    //////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////  reduce规约聚合函数  /////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////


    val list = List(1,2,3,4)

    println("=================  1、reduce基本加操作  ================")

    println(list.reduce( (a:Int, b:Int) => a + b ))        //reduce共有三步1+2,3+3,6+4
    println(list.reduceLeft ((a:Int, b:Int) => a + b ))    //reduce共有三步1+2,3+3,6+4
    println(list.reduceRight((a:Int, b:Int) => a + b ))    // 4+3,7+2, 9+1
    println(list.reduceRight( _ + _ ))                     //简化版 4+3,7+2, 9+1


    println("=================  2、reduce基本减操作  ================")

    val list1 = List(3,4,5,8,10)
    println(list1.reduce(_ - _))                 //依次相减 -24
    println(list1.reduceLeft(_ - _))             //依次相减 -24
    println(list1.reduceRight(_ - _))             //从右往左减 3 - (4 - (5 - (8 - 10)))


    //////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////  fold 折叠  /////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////

    println("=================  3、fold基本加操作(定义了一个初始值)  ================")

    println(list.fold(10)(_ + _))        //10 + 1 + 2 + 3 + 4
    println(list.foldLeft(10)(_ + _))    //10 + 1 + 2 + 3 + 4

    println("=================  3、fold基本减操作(定义了一个初始值)  ================")

    println(list.foldLeft(10)(_ - _))    //10 - 1 - 2 - 3 - 4
    println(list.foldRight(10)(_ - _))   //(1 - (2 - (3 - (4 - 10)))  = 8 从左到右 向右聚合 初始值在最右边

  }
}
